package com.qf.controller;

import com.qf.utils.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author 86199
 * @version V1.0
 * @Project jqueryDemo
 * @Package com.qf.controller
 * @Description:
 * @Date 2022/5/21 14:57
 */
public class BaseServlet extends HttpServlet {

    @Override
/*
        所有的请求都会进入到这个方法中，这个方法中通过反射机制来动态执行具体的业务方法
        get请求，post请求，put请求，delete请求都会经过这个service



 */

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取请求参数（标识符，方法名）
        String methodStr = req.getParameter(Constants.TAG);

//        2.如果method没有获取到值，我们跳转到首页
        if(methodStr== null ||"".equals(methodStr)){
           methodStr = Constants.INDEX;
        }
//        3.反射调用对应的业务逻辑方法
        Class clazz = this.getClass();
//        获取class类

//        4.从类中获取方法对象
        try {
            Method method = clazz.getMethod(methodStr, HttpServletRequest.class, HttpServletResponse.class);


//           5.执行从类中的获取到的方法对象，
            Object result = method.invoke(this,req, resp);
//          6.根据返回的结果进行判断，判断返回值不为空。
            if (result != null){
//              jump获取到的后例如：“forword：http://localhost:8080/admin/admin.jsp”
                String jump = (String) result;
                if (jump.startsWith(Constants.FORWARD)){
//                7.判断执行的是请求转发处理
//                 获取路径，例如：http://localhost；8080/admin/admin.jsp
                    String path = jump.substring(jump.indexOf(Constants.FLAG) + 1);

                    req.getRequestDispatcher(path).forward(req,resp);

                }else if (jump.startsWith(Constants.REDIRECT)){
//                8.判断执行后重定向处理
//                获取路径，例如http://localhost:8080/admin/admin.jsp
                    String path = jump.substring(jump.indexOf(Constants.FLAG) + 1);
//                    执行重定向
                    resp.sendRedirect(path);
                }else{

//              9.判断如果是其他类型的返回值，那么通过流写回去
                    resp.getWriter().println(jump);
                }

            }

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }


//        5.执行从类中的获取到的方法对象，
    }
}
